-- 
-- Controles sobre estados de stock para la anulacion de facturas conservando los pendientes.
--

-- Constraint para evitar uso de estados inexistentes (nunca deberia ocurrir)
--

ALTER TABLE public.artm
    ADD CONSTRAINT gestion_ai_stkestartm2 FOREIGN KEY (origencodstkest)
    REFERENCES public.stkest (cod) MATCH SIMPLE
    ON UPDATE NO ACTION
    ON DELETE RESTRICT;
    
 --  
 -- Funcion de trigger que evita el uso de arcos que no existen (tampoco deberia ocurrir)
 --   
	
CREATE OR REPLACE FUNCTION public.tg_artm_ins_liberapendientes()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
  ModificaStockDelAnulado varchar;
BEGIN

  IF NEW.OrigenIdArtm < 0 then -- Mi artm apunta a la factura, hay que quitarle el origen para que no tome de nadie
  BEGIN
    --
    -- Si el grafo correspondiente a anulados no existe muestra una excepción
	--
    IF NOT exists (SELECT * 
			   FROM ARTM 
			   INNER JOIN COMM on COMM.Id = ARTM.IdComm
			   INNER JOIN STKGRA ON STKGRA.OrigenCodStkEst = '<A>' AND STKGRA.DestinoCodStkEst = Artm.CodStkEst 
			                     and STKGRA.TipoCom = COMM.TipoCom AND ARTM.Signo = STKGRA.Signo
			   WHERE ARTM.ID = NEW.OrigenIDARTM * -1) THEN 
			   raise exception 'La configuracion de stock no es apropiada para esta acción, deben corregirse el flujo de stock';
    END IF;
	
	
			
    UPDATE ARTM
    SET OrigenIDARTM = Null, OrigenCODSTKEST = '<A>'
    WHERE NOT (ARTM.ORIGENCODSTKEST = '<E>' OR ARTM.ORIGENCODSTKEST = '<X>')
          AND (ARTM.ID = NEW.OrigenIDARTM * -1);
    StockDelAnulado := (SELECT ModificaStock FROM ARTM where id = NEW.OrigenIDARTM * -1);
	--
    -- El valor del modifica stock en este caso es procesado por el trigger de actualizacion 
	-- de stock por eso es X o Y 
	--
    NEW.ModificaStock := CASE WHEN ModificaStockDelAnulado = 'S' THEN 'X' ELSE 'Y' END;
    NEW.OrigenIDARTM  := NULL;

  END;
  END IF;
  

RETURN NEW;

END;
$BODY$;

ALTER FUNCTION public.tg_artm_ins_liberapendientes()
    OWNER TO abacouser;

COMMENT ON FUNCTION public.tg_artm_ins_liberapendientes()
    IS 'Cuerpo del trigger de artm que actualiza la cantidad de articulos aun no tomados de este movimiento como entrada de otro.';


--
SELECT aaVersion('518.01','518.00');
--	
	
	


